package com.xiaomage.ipcdemo

import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.*
import android.support.v7.app.AppCompatActivity
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import com.xiaomage.ipcdemo.Constants.TAG
class MainActivity : AppCompatActivity() {


    //服务端messenger
    private var messengerService:Messenger?=null

    //客户端吗，messenger
    private val messengerClient=Messenger(MessageHandler())

    private val mServiseConnection=object:ServiceConnection{
        override fun onServiceDisconnected(name: ComponentName?) {
            Log.d(TAG,"onServiceDisconnected")
         messengerService=null
        }

        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            Log.d(TAG,"onServiceConnected")
            messengerService= Messenger(service)
        }

    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val pid=android.os.Process.myPid()
        Log.d(TAG,"pid:$pid")
        //绑定服务
        bindService()

        bt_bundle.setOnClickListener{
            val bundle=Bundle()
            bundle.putString("name","小马哥")
            intent= Intent(this,Main2Activity::class.java)
            intent.putExtras(bundle)
            startActivity(intent)
        }

        bt_message.setOnClickListener {
            Log.d(TAG,"点击了")
            Thread(Runnable { sendMessage() }).start()
        }
        bt_aidl.setOnClickListener{
            intent=Intent(this,AIDLActivity::class.java)
            startActivity(intent)
        }
        bt_content_provider_contact.setOnClickListener{
            intent=Intent(this,ContentProviderContactActivity::class.java)
            startActivity(intent)

        }

    }

    /**绑定服务
     * 绑定服务需要需要设置ServiceConnection和标志位，方法如下：
     * bindService(Intent service, ServiceConnection conn, int flags)
     * ServiceConnection可以监听服务的状态，在进行服务绑定的时，其标志位可以为以下几种（这里列出3种）：
     * 1).Context.BIND_AUTO_CREATE
     * 说明：表示收到绑定请求的时候，如果服务尚未创建，则即刻创建，
     * 在系统内存不足需要先摧毁优先级组件来释放内存，
     * 且只有驻留该服务的进程成为被摧毁对象时，服务才被摧毁
     * 2).Context.BIND_DEBUG_UNBIND
     * 说明：通常用于调试场景中判断绑定的服务是否正确，
     * 但容易引起内存泄漏，因此非调试目的的时候不建议使用
     * 3).Context.BIND_NOT_FOREGROUND
     * 说明：表示系统将阻止驻留该服务的进程具有前台优先级，
     * 仅在后台运行，该标志位位于Froyo中引入。
     */
    private fun bindService(){
        intent=Intent(this,MessageService::class.java)
        bindService(intent,mServiseConnection, Context.BIND_AUTO_CREATE)
        Log.d(TAG,"完成绑定")
    }

    //发送信息
    private fun sendMessage(){
        val message=Message.obtain(null,Constants.MESSAGE_FROM_CLIENT,54,27)
        val bundle=Bundle()
        bundle.putString(Constants.MESSAGE_KEY,"我爱你ლ(′◉❥◉｀ლ)")
        message.data=bundle
        message.replyTo=messengerClient
        messengerService?.send(message)
    }

    override fun onDestroy() {
        unbindService(mServiseConnection)
        super.onDestroy()
    }
}
